package samples.SerialDemo;

/*
 * @(#)SerialParameters.java	1.9 00/05/04 SMI
 * 
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 * 
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license
 * to use, modify and redistribute this software in source and binary
 * code form, provided that i) this copyright notice and license appear
 * on all copies of the software; and ii) Licensee does not utilize the
 * software in a manner which is disparaging to Sun.
 * 
 * This software is provided "AS IS," without a warranty of any kind.
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
 * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
 * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
 * SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
 * BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
 * HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
 * OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 * 
 * This software is not designed or intended for use in on-line control
 * of aircraft, air traffic, aircraft navigation or aircraft
 * communications; or in the design, construction, operation or
 * maintenance of any nuclear facility. Licensee represents and
 * warrants that it will not use or redistribute the Software for such
 * purposes.
 */
import javax.comm.*;

/**
 * A class that stores parameters for serial ports.
 */
public class SerialParameters
{
	private String portName;
	private int baudRate;
	private int flowControlIn;
	private int flowControlOut;
	private int databits;
	private int stopbits;
	private int parity;

	/**
	 * Default constructer. Sets parameters to no port, 9600 baud, no flow
	 * control, 8 data bits, 1 stop bit, no parity.
	 */
	public SerialParameters()
	{
		this("", 9600, SerialPort.FLOWCONTROL_NONE, SerialPort.FLOWCONTROL_NONE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
	}

	/**
	 * Paramaterized constructer.
	 * 
	 * @param portName
	 *            The name of the port.
	 * @param baudRate
	 *            The baud rate.
	 * @param flowControlIn
	 *            Type of flow control for receiving.
	 * @param flowControlOut
	 *            Type of flow control for sending.
	 * @param databits
	 *            The number of data bits.
	 * @param stopbits
	 *            The number of stop bits.
	 * @param parity
	 *            The type of parity.
	 */
	public SerialParameters( String portName, int baudRate, int flowControlIn, int flowControlOut, int databits, int stopbits, int parity )
	{
		this.portName = portName;
		this.baudRate = baudRate;
		this.flowControlIn = flowControlIn;
		this.flowControlOut = flowControlOut;
		this.databits = databits;
		this.stopbits = stopbits;
		this.parity = parity;
	}

	/**
	 * Sets port name.
	 * 
	 * @param portName
	 *            New port name.
	 */
	public void setPortName( String portName )
	{
		this.portName = portName;
	}

	/**
	 * Gets port name.
	 * 
	 * @return Current port name.
	 */
	public String getPortName()
	{
		return portName;
	}

	/**
	 * Sets baud rate.
	 * 
	 * @param baudRate
	 *            New baud rate.
	 */
	public void setBaudRate( int baudRate )
	{
		this.baudRate = baudRate;
	}

	/**
	 * Sets baud rate.
	 * 
	 * @param baudRate
	 *            New baud rate.
	 */
	public void setBaudRate( String baudRate )
	{
		this.baudRate = Integer.parseInt(baudRate);
	}

	/**
	 * Gets baud rate as an <code>int</code>.
	 * 
	 * @return Current baud rate.
	 */
	public int getBaudRate()
	{
		return baudRate;
	}

	/**
	 * Gets baud rate as a <code>String</code>.
	 * 
	 * @return Current baud rate.
	 */
	public String getBaudRateString()
	{
		return Integer.toString(baudRate);
	}

	/**
	 * Sets flow control for reading.
	 * 
	 * @param flowControlIn
	 *            New flow control for reading type.
	 */
	public void setFlowControlIn( int flowControlIn )
	{
		this.flowControlIn = flowControlIn;
	}

	/**
	 * Sets flow control for reading.
	 * 
	 * @param flowControlIn
	 *            New flow control for reading type.
	 */
	public void setFlowControlIn( String flowControlIn )
	{
		this.flowControlIn = stringToFlow(flowControlIn);
	}

	/**
	 * Gets flow control for reading as an <code>int</code>.
	 * 
	 * @return Current flow control type.
	 */
	public int getFlowControlIn()
	{
		return flowControlIn;
	}

	/**
	 * Gets flow control for reading as a <code>String</code>.
	 * 
	 * @return Current flow control type.
	 */
	public String getFlowControlInString()
	{
		return flowToString(flowControlIn);
	}

	/**
	 * Sets flow control for writing.
	 * 
	 * @param flowControlIn
	 *            New flow control for writing type.
	 */
	public void setFlowControlOut( int flowControlOut )
	{
		this.flowControlOut = flowControlOut;
	}

	/**
	 * Sets flow control for writing.
	 * 
	 * @param flowControlIn
	 *            New flow control for writing type.
	 */
	public void setFlowControlOut( String flowControlOut )
	{
		this.flowControlOut = stringToFlow(flowControlOut);
	}

	/**
	 * Gets flow control for writing as an <code>int</code>.
	 * 
	 * @return Current flow control type.
	 */
	public int getFlowControlOut()
	{
		return flowControlOut;
	}

	/**
	 * Gets flow control for writing as a <code>String</code>.
	 * 
	 * @return Current flow control type.
	 */
	public String getFlowControlOutString()
	{
		return flowToString(flowControlOut);
	}

	/**
	 * Sets data bits.
	 * 
	 * @param databits
	 *            New data bits setting.
	 */
	public void setDatabits( int databits )
	{
		this.databits = databits;
	}

	/**
	 * Sets data bits.
	 * 
	 * @param databits
	 *            New data bits setting.
	 */
	public void setDatabits( String databits )
	{
		if (databits.equals("5"))
		{
			this.databits = SerialPort.DATABITS_5;
		}

		if (databits.equals("6"))
		{
			this.databits = SerialPort.DATABITS_6;
		}

		if (databits.equals("7"))
		{
			this.databits = SerialPort.DATABITS_7;
		}

		if (databits.equals("8"))
		{
			this.databits = SerialPort.DATABITS_8;
		}
	}

	/**
	 * Gets data bits as an <code>int</code>.
	 * 
	 * @return Current data bits setting.
	 */
	public int getDatabits()
	{
		return databits;
	}

	/**
	 * Gets data bits as a <code>String</code>.
	 * 
	 * @return Current data bits setting.
	 */
	public String getDatabitsString()
	{
		switch (databits)
		{

		case SerialPort.DATABITS_5:
			return "5";

		case SerialPort.DATABITS_6:
			return "6";

		case SerialPort.DATABITS_7:
			return "7";

		case SerialPort.DATABITS_8:
			return "8";

		default:
			return "8";
		}
	}

	/**
	 * Sets stop bits.
	 * 
	 * @param stopbits
	 *            New stop bits setting.
	 */
	public void setStopbits( int stopbits )
	{
		this.stopbits = stopbits;
	}

	/**
	 * Sets stop bits.
	 * 
	 * @param stopbits
	 *            New stop bits setting.
	 */
	public void setStopbits( String stopbits )
	{
		if (stopbits.equals("1"))
		{
			this.stopbits = SerialPort.STOPBITS_1;
		}

		if (stopbits.equals("1.5"))
		{
			this.stopbits = SerialPort.STOPBITS_1_5;
		}

		if (stopbits.equals("2"))
		{
			this.stopbits = SerialPort.STOPBITS_2;
		}
	}

	/**
	 * Gets stop bits setting as an <code>int</code>.
	 * 
	 * @return Current stop bits setting.
	 */
	public int getStopbits()
	{
		return stopbits;
	}

	/**
	 * Gets stop bits setting as a <code>String</code>.
	 * 
	 * @return Current stop bits setting.
	 */
	public String getStopbitsString()
	{
		switch (stopbits)
		{

		case SerialPort.STOPBITS_1:
			return "1";

		case SerialPort.STOPBITS_1_5:
			return "1.5";

		case SerialPort.STOPBITS_2:
			return "2";

		default:
			return "1";
		}
	}

	/**
	 * Sets parity setting.
	 * 
	 * @param parity
	 *            New parity setting.
	 */
	public void setParity( int parity )
	{
		this.parity = parity;
	}

	/**
	 * Sets parity setting.
	 * 
	 * @param parity
	 *            New parity setting.
	 */
	public void setParity( String parity )
	{
		if (parity.equals("None"))
		{
			this.parity = SerialPort.PARITY_NONE;
		}

		if (parity.equals("Even"))
		{
			this.parity = SerialPort.PARITY_EVEN;
		}

		if (parity.equals("Odd"))
		{
			this.parity = SerialPort.PARITY_ODD;
		}
	}

	/**
	 * Gets parity setting as an <code>int</code>.
	 * 
	 * @return Current parity setting.
	 */
	public int getParity()
	{
		return parity;
	}

	/**
	 * Gets parity setting as a <code>String</code>.
	 * 
	 * @return Current parity setting.
	 */
	public String getParityString()
	{
		switch (parity)
		{

		case SerialPort.PARITY_NONE:
			return "None";

		case SerialPort.PARITY_EVEN:
			return "Even";

		case SerialPort.PARITY_ODD:
			return "Odd";

		default:
			return "None";
		}
	}

	/**
	 * Converts a <code>String</code> describing a flow control type to an
	 * <code>int</code> type defined in <code>SerialPort</code>.
	 * 
	 * @param flowControl
	 *            A <code>string</code> describing a flow control type.
	 * @return An <code>int</code> describing a flow control type.
	 */
	private int stringToFlow( String flowControl )
	{
		if (flowControl.equals("None"))
		{
			return SerialPort.FLOWCONTROL_NONE;
		}

		if (flowControl.equals("Xon/Xoff Out"))
		{
			return SerialPort.FLOWCONTROL_XONXOFF_OUT;
		}

		if (flowControl.equals("Xon/Xoff In"))
		{
			return SerialPort.FLOWCONTROL_XONXOFF_IN;
		}

		if (flowControl.equals("RTS/CTS In"))
		{
			return SerialPort.FLOWCONTROL_RTSCTS_IN;
		}

		if (flowControl.equals("RTS/CTS Out"))
		{
			return SerialPort.FLOWCONTROL_RTSCTS_OUT;
		}

		return SerialPort.FLOWCONTROL_NONE;
	}

	/**
	 * Converts an <code>int</code> describing a flow control type to a
	 * <code>String</code> describing a flow control type.
	 * 
	 * @param flowControl
	 *            An <code>int</code> describing a flow control type.
	 * @return A <code>String</code> describing a flow control type.
	 */
	String flowToString( int flowControl )
	{
		switch (flowControl)
		{

		case SerialPort.FLOWCONTROL_NONE:
			return "None";

		case SerialPort.FLOWCONTROL_XONXOFF_OUT:
			return "Xon/Xoff Out";

		case SerialPort.FLOWCONTROL_XONXOFF_IN:
			return "Xon/Xoff In";

		case SerialPort.FLOWCONTROL_RTSCTS_IN:
			return "RTS/CTS In";

		case SerialPort.FLOWCONTROL_RTSCTS_OUT:
			return "RTS/CTS Out";

		default:
			return "None";
		}
	}

}
